package Day021_反射_注解.demo5_反射之操作成员方法;

import java.lang.reflect.Method;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/14 11:33
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
        /*
             Method getDeclaredMethod(String name,Class...args); 获取任意修饰符修饰的单个成员方法\
             Method[] getDeclaredMethods(); 获取所有成员方法

            通过反射技术执行成员方法:
                Method对象常用方法
                    *  Object invoke(Object obj, Object... args)
                        * 参数1: 调用该方法的对象
                        * 参数2：调用方法时传递的实际参数,如果方法没有参数,就不传
                    *  void setAccessible(true)
                        设置"暴力访问"——是否取消权限检查，true取消权限检查，false表示不取消
         */
        // 0.获取Student类的Class对象
        Class<?> c = Class.forName("com.itheima.demo5_反射之操作成员方法.Student");

        // 1.通过反射获取public修饰的成员方法对象,并通过反射执行该方法
        // 1.1 通过反射获取public修饰的成员方法对象
        Method show1M = c.getDeclaredMethod("show1", String.class, int.class);

        // 1.2 通过反射执行该方法
        Student stu = new Student();// 使用反射创建对象:通过反射获取构造方法对象,执行该构造方法
        show1M.invoke(stu,"itheima",14);

        System.out.println("=======================");
        // 2.通过反射获取private修饰的成员方法对象,并通过反射执行该方法
        // 2.1 通过反射获取private修饰的成员方法对象
        Method show3M = c.getDeclaredMethod("show3");

        // 2.2 通过反射执行该方法
        // 设置暴力反射
        show3M.setAccessible(true);
        show3M.invoke(stu);
    }
}
